package prueba.unitaria;

import static org.junit.Assert.*;

import java.math.BigDecimal;
import java.util.HashSet;
import java.util.Set;

import modelo.Expresion;
import modelo.Variable;

import org.junit.Before;
import org.junit.Test;

import evaluacion.EvalAdapter;
import evaluacion.EvaluadorMatematico;

public class EvaluadorMatematicoPrueba {
	
	private EvaluadorMatematico evaluador;

	@Before
	public void setUp() throws Exception {
		
		evaluador = new EvalAdapter();
		
	}

	@Test
	public  void testEvaluarExpression1() {
		
		Expresion expresion = new Expresion("(x+4*3)+2");
		Set<Variable> variables = new HashSet<Variable>();
		variables.add(new Variable("x", new BigDecimal(6), "global"));
		BigDecimal valor =evaluador.evaluarExpression(expresion, variables);
		
		assertEquals("La expresion no fue calculada correctamente.",20, valor.doubleValue(),.0000000000001);
		
		
		
		
	}
	
	@Test
	public  void testEvaluarExpression2() {
		
		Expresion expresion = new Expresion("((x+4*3)+2)/y");
		Set<Variable> variables = new HashSet<Variable>();
		variables.add(new Variable("x", new BigDecimal(6), "global"));
		variables.add(new Variable("y", new BigDecimal(40),"global"));
		BigDecimal valor =evaluador.evaluarExpression(expresion, variables);
		
		Double esperado = 0.5;
		assertEquals("La expresion no fue calculada correctamente.",esperado, valor.doubleValue(),.0000000000001);
		
		
		
		
	}
	
	@Test
	public  void testEvaluarExpression3() {
		
		Expresion expresion = new Expresion("-b +( b*b - 4*a*c) / (2*a)");
		Set<Variable> variables = new HashSet<Variable>();
		variables.add(new Variable("b", new BigDecimal(6), "global"));
		variables.add(new Variable("a", new BigDecimal(40),"global"));
		variables.add(new Variable("c", new BigDecimal(50),"global"));
		BigDecimal valor =evaluador.evaluarExpression(expresion, variables);
		
		
		
	}
	

	@Test
	public  void testVerificarExpression1() {
		Expresion expresion = new Expresion("x+3");
		Set<Variable> variables = new HashSet<Variable>();
		boolean resultado = evaluador.verificarExpression(expresion,variables);
	
		assertFalse("La expresion le falta una variable.", resultado);
	
		
		
	}
	
	
	
	@Test
	public  void testVerificarExpression2() {
		Expresion expresion = new Expresion("sdfsddfdsf");
		Set<Variable> variables = new HashSet<Variable>();
		boolean resultado = evaluador.verificarExpression(expresion,variables);
	
		assertFalse("La expresion esta mal formada.", resultado);
	
		
		
	}
	
	@Test
	public  void testVerificarExpression3() {
		Expresion expresion = new Expresion("x+3");
		Set<Variable> variables = new HashSet<Variable>();
		variables.add(new Variable("x", new BigDecimal(6), "global"));
		boolean resultado = evaluador.verificarExpression(expresion,variables);
	
		assertTrue("La expresion esta bien formada.", resultado);
	
		
		
	}

}
